package main

import (
  "fmt"
  "path/filepath"
)

func main() {
  // base()
  // dir()
  // ext()
  // isAbs()
  // join()
  // match()
  // rel()
  // split()
  splitList()
}

/**
  Base 返回路径的最后一个元素。
  在提取最后一个元素之前删除尾随路径分隔符。
  如果路径为空，则 Base 返回“.”。
  如果路径完全由分隔符组成，则 Base 返回单个分隔符。
**/
func base() {
  fmt.Println("On windows:")
  //baz.js
  fmt.Println(filepath.Base("/foo/bar/baz.js"))
  //baz
  fmt.Println(filepath.Base("/foo/bar/baz"))
  //baz
  fmt.Println(filepath.Base("/foo/bar/baz/"))
  //dev.txt
  fmt.Println(filepath.Base("dev.txt"))
  //todo.txt
  fmt.Println(filepath.Base("../todo.txt"))
  //..
  fmt.Println(filepath.Base(".."))
  //.
  fmt.Println(filepath.Base("."))
  //\
  fmt.Println(filepath.Base("/"))
  //.
  fmt.Println(filepath.Base(""))
}

/**
  Dir 返回除路径的最后一个元素之外的所有元素，通常是路径的目录。
  删除最后一个元素后，Dir 在路径上调用 Clean 并删除尾部斜杠。
  如果路径为空，则 Dir 返回“.”。
  如果路径完全由分隔符组成，则 Dir 返回单个分隔符。
  返回的路径不以分隔符结尾，除非它是根目录。
**/
func dir() {
  fmt.Println("On windows:")
  //\foo\bar
  fmt.Println(filepath.Dir("/foo/bar/baz.js"))
  //\foo\bar
  fmt.Println(filepath.Dir("/foo/bar/baz"))
  //\foo\bar\baz
  fmt.Println(filepath.Dir("/foo/bar/baz/"))
  //\dirty\path
  fmt.Println(filepath.Dir("/dirty//path///"))
  //.
  fmt.Println(filepath.Dir("dev.txt"))
  //..
  fmt.Println(filepath.Dir("../todo.txt"))
  //.
  fmt.Println(filepath.Dir(".."))
  //.
  fmt.Println(filepath.Dir("."))
  //\
  fmt.Println(filepath.Dir("/"))
  //.
  fmt.Println(filepath.Dir(""))
}

/**
  Ext 返回路径使用的文件扩展名。
  扩展名是从路径最后一个元素的最后一个点开始的后缀； 如果没有点，则为空。
**/
func ext() {
  //""
  fmt.Printf("No dots: %q\n", filepath.Ext("index"))
  //.js
  fmt.Printf("One dot: %q\n", filepath.Ext("index.js"))
  //.js
  fmt.Printf("Two dots: %q\n", filepath.Ext("main.test.js"))
}

/**
  IsAbs 返回路径是否为绝对路径
**/
func isAbs() {
  fmt.Println("On Windows:")
  //false
  fmt.Println(filepath.IsAbs("/home/gopher"))
  //false
  fmt.Println(filepath.IsAbs(".bashrc"))
  //false
  fmt.Println(filepath.IsAbs(".."))
  //false
  fmt.Println(filepath.IsAbs("."))
  //false
  fmt.Println(filepath.IsAbs("/"))
  //false
  fmt.Println(filepath.IsAbs(""))
  //true
  fmt.Println(filepath.IsAbs("E:\\"))
}

/**
  Join 将任意数量的路径元素连接到单个路径中，并使用特定于操作系统的分隔符将它们分开。
  空元素被忽略。 结果被清理了。 但是，如果参数列表为空或其所有元素为空，Join 将返回一个空字符串。
  在 Windows 上，如果第一个非空元素是 UNC 路径，则结果只会是 UNC 路径
**/
func join() {
  fmt.Println("on windows:")
  //a\b\c
  fmt.Println(filepath.Join("a", "b", "c"))
  //a\b\c
  fmt.Println(filepath.Join("a", "b/c"))
  //a\b\c
  fmt.Println(filepath.Join("a/b", "c"))
  //a\b\c
  fmt.Println(filepath.Join("a/b", "/c"))
  //..\xyz
  fmt.Println(filepath.Join("a/b", "../../../xyz"))
  //xyz
  fmt.Println(filepath.Join("a/b", "../../xyz"))
  //a\xyz
  fmt.Println(filepath.Join("a/b", "../xyz"))
}

func match() {
  fmt.Println("on windows:")
  //匹配任何非分隔符字符 true <nil>
  fmt.Println(filepath.Match("/home/catch/*", "/home/catch/foo"))
	fmt.Println(filepath.Match("/home/catch/*", "/home/catch/foo/bar"))
  //匹配任何单个非分隔符 true <nil>
	fmt.Println(filepath.Match("/home/?opher", "/home/gopher"))
  //在 Windows 上，转义被禁用。 相反，'\\' 被视为路径分隔符 false <nil>
	fmt.Println(filepath.Match("/home/\\*", "/home/*"))
}

func rel(){
  paths := []string {
    "/b/c",
    "/b/c",
    "./b/c",
  }
  base := "/a"
  fmt.Println("On windows:")
	for _, p := range paths {
		rel, err := filepath.Rel(base, p)
		fmt.Printf("%q: %q %v\n", p, rel, err)
	}
}

func split() {
	paths := []string{
		"/home/arnie/amelia.jpg",
		"/mnt/photos/",
		"rabbit.jpg",
		"/usr/local//go",
	}
	fmt.Println("On windows:")
	for _, p := range paths {
		dir, file := filepath.Split(p)
		fmt.Printf("input: %q\n\tdir: %q\n\tfile: %q\n", p, dir, file)
	}
}

func splitList() {
  fmt.Println("On windows:", filepath.SplitList("/a/b/c:/usr/bin"))
}